2019/08/28

CSV中の楕円体高を一括で標高に置き換えるPythonプログラムを作った

先日「CSV中の楕円体高を標高に置き換えるアプリがあって、便利なのだがWindows用でMacで使えない」という話を聞いて、EllapsoidToElevation というのをPythonで作ってみた。

https://github.com/naokiueda/EllapsoidToElevation

対象となるCSVは
・カンマ区切り、タブ区切り、スペース区切りのいずれか
・1行目か2行目にヘッダがある
・ヘッダに(大文字小文字区別なしで)「latitude/longitude/altitude」または「lat/long(lon,lng)/alt」の文言が含まれたカラムがある

これを指定すると、altitudeのカラムの数値を取ってきて

標高 = 楕円体高 - ジオイド高

の演算をして、標高に置き換えます。




標高やジオイド高について、詳しくはこちらの国土地理院のサイトで解説されています。

ジオイド高のデータは国土地理院のダウンロードサイトで配布されています。ジオイドの計算も同サイトからダウンロードしたドキュメントに記述されている「ジオイド高内挿計算」の式を使っていて、同梱配布されているアプリと誤差1㎜未満で一致しています。

毎回ジオイドデータを読むのが遅かったので、初回にPythonの配列定義を書いて、次回以降それをインポートするようにしました。これで若干処理が早くなります。

MITライセンスです。自由にお使いください。

2019/02/01

C#で座標変換するの、DotSpatial 使ったら超簡単 だった。(けどJGD2011未対応 。。。)

C# で緯度経度(WGS84)から、日本の測量座標系に変換するの、これまで C++用のproj4.dll を無理やり呼んでたのを、マネージドコードで完結させたかったので、初めてDotSpatial 使ってみた。
これが超簡単で感激したので、何年かぶりの書込み。。

まずインストールやけど、Nugetパッケージで取れるので、簡単。

Onlineのところで、検索窓に dotspatial で検索、
DotSpatial.Projections をインストール。これだけ。



C#のコードは

using DotSpatial.Projections;  //先頭で宣言
:
:
//値の準備
double[] lonlat = { 135.654321, 34.123456 };    //経度をセット、経度が先
double[] alt = {0d}; //高度はゼロ固定
ProjectionInfo wgs84 = ProjectionInfo.FromEpsgCode(4326);   //WGS84 変換元プロジェクション
ProjectionInfo jdg2000_6 = ProjectionInfo.FromEpsgCode(2448);  //測量座標系2000の6系のプロジェクション

//変換
DotSpatial.Projections.Reproject.ReprojectPoints(
                lonlat,
                alt,
                wgs84,
                jdg2000_6,
                0,
                1
);

//これでlonlatが書き換わって返ってくる
Console.Write(lonlat[0]);      //これは -31886.089481363244
Console.Write(lonlat[1]);       //これは -208112.27778280032

と超楽。この例では1点だけやけど、インテリセンスで出てくる引数を見てると、座標と高さを配列で与えると一括処理もできるみたい。






国土地理院の計算サイトで結果を比較してみると、誤差が出てくるのが0.1ミリのオーダーだったからまあよし。

ただ、東日本大震災でずれた地盤に対応したJGD2011に未対応みたい。(残念)

JGD2011の6系(EPSG 6674)を指定すると、

ProjectionInfo.FromEpsgCode(6674);



まんま、プロジェクションが無いエラーになる。

DotSpatial のサイトでソースを取ってきて、マスターと思われるGDALのファイルとDIFFしてみると、明らかにDotSpatialのファイルが古いみたいで、JGD2011だけじゃなくて6000番台あたりいろいろ無いのがわかる。

定義ファイルが入ってないだけみたいなので、一応Issueに上げておいた。。。

2019/2/2 追記

とりあえずForkして、JGD2011 が使えるもの を作っておいた。